package com.kaifamiao.bytestreams;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 根据是否直接从数据源读取数据将流分为:
 * 1、节点流: 直接从数据源读取数据或向数据源写入数据
 *          比如直接从文件中读取数据的流、直接向文件中输出数据的流
 *
 * 2、过滤流: 从其它流中读取数据或向其它流中写入数据
 *          比如 缓冲输入流、缓冲输出流
 *          (过滤流也被称作 包装流 或 处理流 或 功能流)
 * 3、对于带有缓存功能的流来说，可以实现 mark 操作 和 reset 操作
 * 4、通过 markSupported 方法可以判断 字节输入流 是否支持 mark 和 reset
 */
public class BufferedInputStreamTest {

    public static void main(String[] args) throws IOException {
        // 用于读取指定文件内容的`节点流`
        InputStream inStream = new FileInputStream( "hello.txt" );
        System.out.println( inStream.markSupported() ); // false
        // 创建一个以指定字节输入流为底层支持流的、带有缓冲功能的字节输入流
        BufferedInputStream bis = new BufferedInputStream( inStream );
        System.out.println( bis.markSupported() ); // true

        int b;
        while( ( b = bis.read() ) != -1 ){
            char ch = (char)b;
            System.out.print( ch );
            if( ch == 'a' ) {
                // 在缓冲输入流中的当前位置做标记(即记录当前位置)
                bis.mark(0 );
            }
        }

        System.out.println( "- ".repeat( 10 ) );

        // 返回到最后做标记的位置
        bis.reset();

        while( ( b = bis.read() ) != -1 ){
            char ch = (char)b;
            System.out.print( ch );
            if( ch == 'o' ) {
                bis.mark(-250 << 10 );
            }
        }


        bis.close();
        inStream.close();
    }

}
